home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / SOUND / IT205.ZIP / ITTECH.DOC < prev    next >
Encoding:
Text File  |  1996-08-15  |  43.5 KB  |  866 lines

  1.  
  2.                              Impulse Header Layout
  3.  
  4.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  5.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  6. 0000: │'I'│'M'│'P'│'M'│ Song Name, max 26 characters, includes NULL   │
  7.       ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
  8. 0010: │.......................................................│ x │ x │
  9.       ├───────┬───────┬───────┬───────┬───────┬───────┬───────┼───┴───┤
  10. 0020: │OrdNum │InsNum │SmpNum │PatNum │ Cwt/v │ Cmwt  │ Flags │Special│
  11.       ├───┬───┼───┬───┼───┬───┼───────┼───────┴───────┼───┬───┼───┬───┤
  12. 0030: │GV │MV │IS │IT │Sep│(0)│MsgLgth│Message Offset │ x │ x │ x │ x │
  13.       ├───┴───┴───┴───┴───┴───┴───────┴───────────────┴───┴───┴───┴───┤
  14. 0040: │ Chnl Pan (64 bytes)...........................................│
  15.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  16.  
  17.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  18. 0080: │ Chnl Vol (64 bytes)...........................................│
  19.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  20.  
  21.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  22. 00C0: │ Orders, Length = OrdNum                                       │
  23.       ├───────────────────────────────────────────────────────────────┤
  24. xxxx: │ 'Long' Offset of instruments, Length = InsNum*4 (1)           │
  25.       ├───────────────────────────────────────────────────────────────┤
  26. xxxx: │ 'Long' Offset of samples headers, Length = SmpNum*4 (2)       │
  27.       ├───────────────────────────────────────────────────────────────┤
  28. xxxx: │ 'Long' Offset of patterns, Length = PatNum*4 (3)              │
  29.       └───────────────────────────────────────────────────────────────┘
  30.  
  31.       (1) Offset = 00C0h+OrdNum
  32.       (2) Offset = 00C0h+OrdNum+InsNum*4
  33.       (3) Offset = 00C0h+OrdNum+InsNum*4+SmpNum*4
  34.  
  35.         Note that if the (long) offset to a pattern = 0, then the
  36.         pattern is assumed to be a 64 row empty pattern.
  37.  
  38.       Cwt:      Created with tracker.
  39.                  Impulse Tracker y.xx = 0yxxh
  40.       Cmwt:     Compatible with tracker with version greater than value.
  41.                  (ie. format version)
  42.       OrdNum:   Number of orders in song.
  43.       InsNum:   Number of instruments in song
  44.       SmpNum:   Number of samples in song
  45.       PatNum:   Number of patterns in song
  46.       Flags:    Bit 0: On = Stereo, Off = Mono
  47.                 Bit 1: Vol0MixOptimizations - If on, no mixing occurs if
  48.                        the volume at mixing time is 0 (redundant v1.04+)
  49.                 Bit 2: On = Use instruments, Off = Use samples.
  50.                 Bit 3: On = Linear slides, Off = Amiga slides.
  51.                 Bit 4: On = Old Effects, Off = IT Effects
  52.                         Differences:
  53.                        - Vibrato is updated EVERY frame in IT mode, whereas
  54.                           it is updated every non-row frame in other formats.
  55.                           Also, it is two times deeper with Old Effects ON
  56.                        - Command Oxx will set the sample offset to the END
  57.                          of a sample instead of ignoring the command under
  58.                          old effects mode.
  59.                        - (More to come, probably)
  60.  
  61.       Special:  Bit 0: On = song message attached.
  62.                        Song message:
  63.                         Stored at offset given by "Message Offset" field.
  64.                         Length = MsgLgth.
  65.                         NewLine = 0Dh (13 dec)
  66.                         EndOfMsg = 0
  67.  
  68.                        Note: v1.04+ of IT may have song messages of up to
  69.                              8000 bytes included.
  70.  
  71.                 Bits 1-15: Undefined.
  72.  
  73.       GV:       Global volume. (0->128) All volumes are adjusted by this
  74.       MV:       Mix volume (0->128) During mixing, this value controls
  75.                 the magnitude of the wave being mixed.
  76.       IS:       Initial Speed of song.
  77.       IT:       Initial Tempo of song
  78.       Sep:      Panning separation between channels (0->128, 128 is max sep.)
  79.       Chnl Vol: Volume for each channel. Ranges from 0->64
  80.       Chnl Pan: Each byte contains a panning value for a channel. Ranges from
  81.                  0 (absolute left) to 64 (absolute right). 32 = central pan,
  82.                  100 = Surround sound.
  83.                  +128 = disabled channel (notes will not be played, but note
  84.                                           that effects in muted channels are
  85.                                           still processed)
  86.       Orders:   This is the order in which the patterns are played.
  87.                  Valid values are from 0->199.
  88.                  255 = "---", End of song marker
  89.                  254 = "+++", Skip to next order
  90.  
  91.  
  92.                   Old Impulse Instrument Format (cmwt < 200h)
  93.  
  94.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  95.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  96. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  97.       ├───┼───┼───┼───┼───┬───┬───┬───┬───────┬───┬───┬───────┬───┬───┤
  98. 0010: │00h│Flg│VLS│VLE│SLS│SLE│ x │ x │FadeOut│NNA│DNC│TrkVers│NoS│ x │
  99.       ├───┴───┴───┴───┴───┴───┴───┴───┴───────┴───┴───┴───────┴───┴───┤
  100. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  101.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  102. 0030: │.......................................│ x │ x │ x │ x │ x │ x │
  103.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  104. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  105.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  106.  
  107.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  108. 0130: │ Volume envelope (200 bytes)...................................│
  109.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  110.  
  111.                                       ├───┴───┴───┴───┴───┴───┴───┴───┤
  112. 01F8:                                 │ Node points (25x2 bytes)......│
  113.                                       └───────────────────────────────┘
  114.  
  115.         Total length of old instrument header is 554 bytes.
  116.  
  117.       Flg:      Bit 0. On = Use volume envelope
  118.                 Bit 1. On = Use volume loop
  119.                 Bit 2. On = Use sustain volume loop
  120.       VLS:      Volume loop start (node number)
  121.       VLE:      Volume loop end (node number)
  122.       SLS:      Sustain loop start (node number)
  123.       SLE:      Sustain loop end (node number)
  124.       FadeOut:  Ranges between 0 and 64, but the fadeout "Count" is 512.
  125.                 Fade applied when:
  126.                 1) Note fade NNA is selected and triggered (by another note)
  127.                 2) Note off NNA is selected with no volume envelope
  128.                    or volume envelope loop
  129.                 3) Volume envelope end is reached
  130.  
  131.       DNC:      Duplicate note check (0 = Off, 1 = On)
  132.       NNA:      New note action:
  133.                         0 = Note cut
  134.                         1 = Note continue
  135.                         2 = Note off
  136.                         3 = Note fade
  137.  
  138.       TrkVers:  Tracker version used to save the instrument. This is only
  139.                 used in the instrument files.
  140.       NoS:      Number of samples associated with instrument. This is only
  141.                 used in the instrument files.
  142.  
  143.       Note-Sample/Keyboard Table.
  144.        Each note of the instrument is first converted to a sample number
  145.        and a note (C-0 -> B-9). These are stored as note/sample pairs
  146.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  147.        1-99, 0=no sample)
  148.  
  149.        Volume envelope: Values from 0->64, 0FFh indicating end of envelope.
  150.        (after which note fade applies)
  151.  
  152.       Node data: Tick THEN magnitude
  153.  
  154.  
  155.  
  156.                            Impulse Instrument Format
  157.  
  158.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  159.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  160. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  161.       ├───┼───┼───┼───┼───────┬───┬───┬───┬───┬───┬───┬───────┬───┬───┤
  162. 0010: │00h│NNA│DCT│DCA│FadeOut│PPS│PPC│GbV│DfP│RV │RP │TrkVers│NoS│ x │
  163.       ├───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┴───┴───────┴───┴───┤
  164. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  165.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  166. 0030: │.......................................│ x │ x │ x │ x │ x │ x │
  167.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  168. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  169.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  170.  
  171.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  172. 0130: │ Envelopes.....................................................│
  173.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  174.  
  175.         NNA = New Note Action
  176.                 0 = Cut                 1 = Continue
  177.                 2 = Note off            3 = Note fade
  178.  
  179.         DCT = Duplicate Check Type
  180.                 0 = Off                 1 = Note
  181.                 2 = Sample              3 = Instrument
  182.  
  183.         DNA: Duplicate Check Action
  184.                 0 = Cut
  185.                 1 = Note Off
  186.                 2 = Note fade
  187.  
  188.       FadeOut:  Ranges between 0 and 128, but the fadeout "Count" is 1024
  189.                 See the Last section on how this works.
  190.                 Fade applied when:
  191.                 1) Note fade NNA is selected and triggered (by another note)
  192.                 2) Note off NNA is selected with no volume envelope
  193.                    or volume envelope loop
  194.                 3) Volume envelope end is reached
  195.  
  196.         PPS: Pitch-Pan separation, range -32 -> +32
  197.         PPC: Pitch-Pan center: C-0 to B-9 represented as 0->119 inclusive
  198.  
  199.         GbV: Global Volume, 0->128
  200.         DfP: Default Pan, 0->64, &128 => Don't use
  201.         RV: Random volume variation (percentage)
  202.         RP: Random panning variation (panning change - not implemented yet)
  203.  
  204.       TrkVers:  Tracker version used to save the instrument. This is only
  205.                 used in the instrument files.
  206.       NoS:      Number of samples associated with instrument. This is only
  207.                 used in the instrument files.
  208.  
  209.       Note-Sample/Keyboard Table.
  210.        Each note of the instrument is first converted to a sample number
  211.        and a note (C-0 -> B-9). These are stored as note/sample byte pairs
  212.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  213.        1-99, 0=no sample)
  214.  
  215.                                 Envelope layout
  216.  
  217.         Envelopes: 3 structures, first for volume (130h), second for
  218.                    panning (182h), third for pitch (1D4h).
  219.  
  220.                    Each is structured as such:
  221.  
  222.         0   1   2   3   4   5   6.......
  223.       ┌───┬───┬───┬───┬───┬───┬───────────────────────────────────┬───┐
  224. xxxx: │Flg│Num│LpB│LpE│SLB│SLE│ Node points, 25 sets, 75 bytes....│ x │
  225.       ├───┼───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┬───┼───┤
  226.  
  227.         Flg: Bit 0: Envelope on/off, 1 = on, 0 = off
  228.              Bit 1: Loop on/off, 1 = on, 0 = off
  229.              Bit 2: SusLoop on/off, 1 = on, 0 = off
  230.  
  231.         Num = Number of node points
  232.  
  233.         LpB = Loop beginning            SLB = Sustain loop beginning
  234.         LpE = Loop end                  SLE = Sustain loop end
  235.  
  236.         Node point = 1 byte for y-value
  237.                         (0->64 for vol, -32->+32 for panning or pitch)
  238.                      1 word (2 bytes) for tick number (0->999)
  239.  
  240.         Total length of an instrument is 547 bytes, but 554 bytes are
  241.         written, just to simplify the loading of the old format. (Hence
  242.         there are 7 'wasted' bytes per instrument)
  243.  
  244.  
  245.  
  246.                              Impulse Sample Format
  247.  
  248.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  249.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  250. 0000: │'I'│'M'│'P'│'S'│ DOS Filename (12345678.123)                   │
  251.       ├───┼───┼───┼───┼───────────────────────────────────────────────┤
  252. 0010: │00h│GvL│Flg│Vol│ Sample Name, max 26 bytes, includes NUL.......│
  253.       ├───┴───┴───┴───┴───────────────────────────────────────┬───────┤
  254. 0020: │.......................................................│Convert│
  255.       ├───────────────┬───────────────┬───────────────┬───────┴───────┤
  256. 0030: │ Length        │ Loop Begin    │ Loop End      │ C5Speed       │
  257.       ├───────────────┼───────────────┼───────────────┼───┬───┬───┬───┤
  258. 0040: │ SusLoop Begin │ SusLoop End   │ SamplePointer │ViS│ViD│ViR│ViT│
  259.       └───────────────┴───────────────┴───────────────┴───┴───┴───┴───┘
  260.  
  261. The cache file has the following pieces of information added on:
  262.  
  263.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  264.       ┌───────────────┬───────┬───────┬───┬───────────────────────────┐
  265. 0050: │ File Size     │ Date  │ Time  │Fmt│...........................│
  266.       └───────────────┴───────┴───────┴───┴───────────────────────────┘
  267.  
  268.         Fmt. 0 = unchecked. 1 = directory, 2 = it sample, 3 = st sample
  269.  
  270.  
  271.       GvL:      Global volume for instrument, ranges from 0->64
  272.       Flg:      Bit 0. On = sample associated with header.
  273.                 Bit 1. On = 16 bit, Off = 8 bit.
  274.                 Bit 2. On = stereo, Off = mono. Stereo samples not supported yet
  275.                 Bit 3. Reserved
  276.                 Bit 4. On = Use loop
  277.                 Bit 5. On = Use sustain loop
  278.                 Bit 6. On = Ping Pong loop, Off = Forwards loop
  279.                 Bit 7. On = Ping Pong Sustain loop, Off = Forwards Sustain loop
  280.       Vol:      Default volume for instrument
  281.  
  282.       Length:   Length of sample in no. of samples NOT no. of bytes
  283.       LoopBeg:  Start of loop (no of samples in, not bytes)
  284.       Loop End: Sample no. AFTER end of loop
  285.       C5Speed:  Number of bytes a second for C-5 (ranges from 0->9999999)
  286.       SusLBeg:  Start of sustain loop
  287.       SusLEnd:  Sample no. AFTER end of sustain loop
  288.  
  289.       SmpPoint: 'Long' Offset of sample in file.
  290.  
  291.       ViS:      Vibrato Speed, ranges from 0->64
  292.       ViD:      Vibrato Depth, ranges from 0->64
  293.       ViT:      Vibrato waveform type.
  294.                         0=Sine wave
  295.                         1=Ramp down
  296.                         2=Square wave
  297.                         3=Random (speed is irrelevant)
  298.       ViR:      Vibrato Rate, rate at which vibrato is applied (0->64)
  299.  
  300.         The depth of the vibrato at any point is worked out in the following
  301.         way:
  302.           Every processing cycle, the following occurs:
  303.                 1) Mov AX, [SomeVariableNameRelatingToVibrato]
  304.                 2) Add AL, Rate
  305.                 3) AdC AH, 0
  306.                 4) AH contains the depth of the vibrato as a fine-linear slide.
  307.                 5) Mov [SomeVariableNameRelatingToVibrato], AX  ; For the next
  308.                                                                 ; cycle.
  309.  
  310.         For those that don't understand assembly, then the depth is
  311.         basically the running-sum of the rate divided by 256.
  312.  
  313.         Sample vibrato uses a table 256-bytes long
  314.  
  315.    Convert:
  316.         Bit 0:
  317.          Off: Samples are unsigned   } IT 2.02 and above use signed samples
  318.           On: Samples are signed     } IT 2.01 and below use unsigned samples
  319.         Bit 1:
  320.          Off: Intel lo-hi byte order for 16-bit samples    } Safe to ignore
  321.          On: Motorola hi-lo byte order for 16-bit samples  } these values
  322.         Bit 2:                                             } for now...
  323.          Off: Samples are stored as PCM values             }
  324.           On: Samples are stored as Delta values           }
  325.         Bit 3:
  326.           On: Samples are stored as byte delta values
  327.  
  328.  
  329.                              Impulse Pattern Format
  330.  
  331.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  332.       ┌───────┬───────┬───┬───┬───┬───┬───────────────────────────────┐
  333. 0000: │Length │ Rows  │ x │ x │ x │ x │ Packed data................   │
  334.       ├───┬───┼───┬───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┤
  335.  
  336.       Length:   Length of packed pattern, not including the 8 byte header
  337.                 Note that the pattern + the 8 byte header will ALWAYS
  338.                 be less than 64k
  339.       Rows:     Number of rows in this pattern (Ranges from 32->200)
  340.  
  341.       Patterns are unpacked by the following pseudocode... (this may look
  342.       horrible, but in practise, it's just as conveninent as the S3M
  343.       pattern format for playback (but not for display))
  344.  
  345.       GetNextChannelMarker:
  346.         Read byte into channelvariable.
  347.         if(channelvariable = 0) then end of row
  348.         Channel = (channelvariable-1) & 63              ; Channel is 0 based.
  349.         if(channelvariable & 128) then read byte into maskvariable
  350.           else maskvariable = previousmaskvariable for current channel
  351.  
  352.         if(maskvariable & 1), then read note. (byte value)
  353.                 // Note ranges from 0->119 (C-0 -> B-9)
  354.                 // 255 = note off, 254 = notecut
  355.                 // 252 = note fade
  356.  
  357.         if(maskvariable & 2), then read instrument (byte value)
  358.                 // Instrument ranges from 1->99
  359.  
  360.         if(maskvariable & 4), then read volume/panning (byte value)
  361.                 // Volume ranges from 0->64
  362.                 // Panning ranges from 0->64, mapped onto 128->192
  363.                 // Prepare for the following also:      }
  364.                 //  65->74 = Fine volume down           } Not implemented
  365.                 //  75->84 = Fine volume up             } at the moment!
  366.                 //  85->94 = Volume slide down          }
  367.                 //  95->104 = Volume slide up           }
  368.                 //  105->114 = Pan slide left           }
  369.                 //  115->124 = Pan slide right          }
  370.  
  371.                 //  193->255 WILL probably be assigned meanings too..
  372.  
  373.         Effects 65 is equivalent to DF0, 66 is equivalent to DF1 -> 74 = DF9
  374.         Similarly for 75-84 (DxF), 85-94 (D0x), 95->104 (Dx0),
  375.         Pan slide left (Px0), Pan slide right (P0x).
  376.  
  377.         These effects will ALL share the same memory, so that in this sequence:
  378.           (DF1)   = 66    -> Volume slide down by 1
  379.           (DF0)   = 65    -> Volume slide down by one again
  380.           (D0F)   = 75    -> volume slide up by 1
  381.           (P00)   = 105   -> Pan slide left by 1
  382.           (P00)   = 115   -> Pan slide right by 1
  383.  
  384.           (DF2)   = 66    -> Volume slide down by 2
  385.           (DF0)   = 65    -> Volume slide down by 2 again
  386.           (D0F)   = 75    -> volume slide up by 2
  387.           (P00)   = 105   -> Pan slide left by 2
  388.           (P00)   = 115   -> Pan slide right by 2
  389.  
  390.         if(maskvariable & 8), then read command (byte value) and commandvalue
  391.                 // Valid ranges from 0->31 (0=no effect, 1=A, 2=B, 3=C, etc.)
  392.  
  393.         if(maskvariable & 16), then note = lastnote for channel
  394.         if(maskvariable & 32), then instrument = lastinstrument for channel
  395.         if(maskvariable & 64), then volume/pan = lastvolume/pan for channel
  396.         if(maskvariable & 128), then {
  397.                 command = lastcommand for channel and
  398.                 commandvalue = lastcommandvalue for channel
  399.         }
  400.         Goto GetNextChannelMarker
  401.  
  402.  
  403.  
  404.                                   Mathematics
  405.  
  406. Abbreviations:
  407.  FV = Final Volume (Ranges from 0 to 128). In versions 1.04+, mixed output
  408.       devices are reduced further to a range from 0 to 64 due to lack of
  409.       memory.
  410.  Vol = Volume at which note is to be played. (Ranges from 0 to 64)
  411.  SV = Sample Volume (Ranges from 0 to 64)
  412.  IV = Instrument Volume (Ranges from 0 to 128)
  413.  CV = Channel Volume (Ranges from 0 to 64)
  414.  GV = Global Volume (Ranges from 0 to 128)
  415.  VEV = Volume Envelope Value (Ranges from 0 to 64)
  416.  
  417. In Sample mode, the following calculation is done:
  418.  FV = Vol * SV * CV * GV / 262144               ; Note that 262144 = 2^18
  419.                                                 ; So bit shifting can be done.
  420.  
  421. In Instrument mode the following procedure is used:
  422.  
  423.  1) Update volume envelope value. Check for loops / end of envelope.
  424.  2) If end of volume envelope (ie. position >= 200 or VEV = 0FFh), then turn
  425.         on note fade.
  426.  3) If notefade is on, then NoteFadeComponent (NFC) = NFC - FadeOut
  427.         ; NFC should be initialised to 1024 when a note is played.
  428.  4) FV = Vol * SV * IV * CV * GV * VEV * NFC / 2^40
  429.                                                 ; Note that 8589934592 = 2^33
  430.  
  431. Linear slides work like this:
  432.  Final frequency = Original frequency * 2^(SlideValue/768)
  433.  
  434. (I used a lookup table for the multipliers here)
  435.  
  436. For command Exx, SlideValue = -4*EffectValue
  437. For command EEx, SlideValue = -EffectValue
  438. For command Fxx, SlideValue = 4*EffectValue
  439. For command FEx, SlideValue = EffectValue
  440.  
  441. Note that sample vibrato always uses Linear slides.
  442.  
  443. Notes about effects (as compared to other module formats)
  444.  
  445. C               This is now in *HEX*. (Used to be in decimal in ST3)
  446. E/F/G/H/U       You need to check whether the song uses Amiga/Linear slides.
  447. H/U             Vibrato in Impulse Tracker is two times finer than in
  448.                 any other tracker and is updated EVERY tick.
  449.                 If "Old Effects" is *ON*, then the vibrato is played in the
  450.                 normal manner (every non-row tick and normal depth)
  451. E/F/G           These commands ALL share the same memory.
  452. Oxx             Offsets to samples are to the 'xx00th' SAMPLE. (ie. for
  453.                 16 bit samples, the offset is xx00h*2)
  454.                 Oxx past the sample end will be ignored, unless "Old Effects"
  455.                 is ON, in which case the Oxx will play from the end of the
  456.                 sample.
  457. Yxy             This uses a table 4 times larger (hence 4 times slower) than
  458.                 vibrato or tremelo. If the waveform is set to random, then
  459.                 the 'speed' part of the command is interpreted as a delay.
  460.  
  461. If you read through this document and there are ANY points which you have
  462. troubles with (and have to try out), then let me know - because someone
  463. else will have the same questions - and I'd like to make this DOC as easy
  464. to understand as possible.
  465.  
  466. For Panning....
  467.  Here's the rough procedure used:
  468.  
  469.   NotePan = ChannelPan
  470.   if InstrumentPan=On then NotePan = InstrumentPan
  471.   NotePan = NotePan+(InstrumentNote-PPCenter)*PPSeparation/8
  472.  
  473. Pitch Envelopes
  474.  Each value on the envelope equates to half a semitone. This is interpolated
  475.  64 times for smooth pitch sliding. Positive values indicate a pitch variation
  476.  UP of x semitones, negative values indicate a pitch variation down.
  477.  
  478.                                   General Info
  479.  
  480. The player in Impulse Tracker 'allocates' channels to notes whenever they
  481. are *PLAYED*. In sample mode, the allocation is simple:
  482.                         Virtual Channel = 'Host' channel
  483.  
  484. In instrument mode, the following procedure is used:
  485.  
  486.     Check if channel is already playing ---Yes--> set 'background' flag on.
  487.                 |                                 'Trigger' NNA. If NNA=cut,
  488.                 No                                then use this virtual
  489.                 |                                 channel.
  490.                 |                                          |
  491.                 |<------------------ else -----------------/
  492.                 |
  493.                 v
  494.     Search and find the first non-active virtual channel.
  495.                 |
  496.     Non-active channel found? ----Yes----> Use this for playback.
  497.                 |
  498.                 No
  499.                 |
  500.                 v
  501.    Search through and find the channel of lowest volume that is in the
  502.    'background' (ie. no longer controlled directly)
  503.                 |
  504.    Background channel found? ----Yes----> Use this for playback.
  505.                 |
  506.                 No
  507.                 |
  508.                 v
  509.    Return error - the note is *NOT* allocated a channel, and hence is not
  510.    played.
  511.  
  512.    Actually, this is quite a simple process... just that it's another of
  513.    those 'hassles' to have to write...
  514.  
  515.  
  516.  
  517.                                 Internal Tables
  518.  
  519. FineSineData       Label   Byte
  520.         DB       0,  2,  3,  5,  6,  8,  9, 11, 12, 14, 16, 17, 19, 20, 22, 23
  521.         DB      24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
  522.         DB      45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
  523.         DB      59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
  524.         DB      64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
  525.         DB      59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
  526.         DB      45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
  527.         DB      24, 23, 22, 20, 19, 17, 16, 14, 12, 11,  9,  8,  6,  5,  3,  2
  528.         DB       0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
  529.         DB     -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
  530.         DB     -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
  531.         DB     -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
  532.         DB     -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
  533.         DB     -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
  534.         DB     -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
  535.         DB     -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
  536.  
  537. FineRampDownData   Label   Byte
  538.         DB      64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56
  539.         DB      56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48
  540.         DB      48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40
  541.         DB      40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32
  542.         DB      32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24
  543.         DB      24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16
  544.         DB      16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10,  9,  9,  8
  545.         DB       8,  7,  7,  6,  6,  5,  5,  4,  4,  3,  3,  2,  2,  1,  1,  0
  546.         DB       0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8
  547.         DB      -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16
  548.         DB     -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24
  549.         DB     -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32
  550.         DB     -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40
  551.         DB     -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48
  552.         DB     -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56
  553.         DB     -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64
  554.  
  555. FineSquareWave     Label   Byte
  556.         DB      128 Dup (64), 128 Dup (0)
  557.  
  558. EmptyPattern            Label
  559.         DW      64, 64, 0, 0
  560.         DB      64 Dup (0)
  561.  
  562. ;───────────────────────────────────────────────────────────────────────────────
  563.  
  564. PitchTable              Label   DWord   ; Values are 16.16 bit
  565.    DW      2048, 0,   2170, 0,   2299, 0,   2435, 0,   2580, 0,   2734, 0 ; C-0
  566.    DW      2896, 0,   3069, 0,   3251, 0,   3444, 0,   3649, 0,   3866, 0 ;>B-0
  567.  
  568.    DW      4096, 0,   4340, 0,   4598, 0,   4871, 0,   5161, 0,   5468, 0 ; C-1
  569.    DW      5793, 0,   6137, 0,   6502, 0,   6889, 0,   7298, 0,   7732, 0 ;>B-1
  570.  
  571.    DW      8192, 0,   8679, 0,   9195, 0,   9742, 0,   10321, 0,  10935, 0
  572.    DW      11585, 0,  12274, 0,  13004, 0,  13777, 0,  14596, 0,  15464, 0
  573.  
  574.    DW      16384, 0,  17358, 0,  18390, 0,  19484, 0,  20643, 0,  21870, 0
  575.    DW      23170, 0,  24548, 0,  26008, 0,  27554, 0,  29193, 0,  30929, 0
  576.  
  577.    DW      32768, 0,  34716, 0,  36781, 0,  38968, 0,  41285, 0,  43740, 0
  578.    DW      46341, 0,  49097, 0,  52016, 0,  55109, 0,  58386, 0,  61858, 0
  579.  
  580.    DW      0, 1,      3897, 1,   8026, 1,   12400, 1,  17034, 1,  21944, 1
  581.    DW      27146, 1,  32657, 1,  38496, 1,  44682, 1,  51236, 1,  58179, 1
  582.  
  583.    DW      0, 2,      7794, 2,   16051, 2,  24800, 2,  34068, 2,  43888, 2
  584.    DW      54292, 2,  65314, 2,  11456, 3,  23828, 3,  36936, 3,  50823, 3
  585.  
  586.    DW      0, 4,      15588, 4,  32103, 4,  49600, 4,  2601, 5,   22240, 5
  587.    DW      43048, 5,  65092, 5,  22912, 6,  47656, 6,  8336, 7,   36110, 7
  588.  
  589.    DW      0, 8,      31176, 8,  64205, 8,  33663, 9,  5201, 10,  44481, 10
  590.    DW      20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
  591.  
  592.    DW      0, 16,     62352, 16, 62875, 17, 1790,  19, 10403, 20, 23425, 21
  593.    DW      41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
  594.  
  595. FineLinearSlideUpTable  Label ; Values are 16.16 bit
  596.         DW      0, 1,     59, 1,    118, 1,   178, 1,   237, 1    ; 0->4
  597.         DW      296, 1,   356, 1,   415, 1,   475, 1,   535, 1    ; 5->9
  598.         DW      594, 1,   654, 1,   714, 1,   773, 1,   833, 1    ; 10->14
  599.         DW      893, 1                                            ; 15
  600.  
  601. LinearSlideUpTable      Label ; Value = 2^(Val/192), Values are 16.16 bit
  602.         DW      0,     1, 237,   1, 475,   1, 714,   1, 953,  1  ; 0->4
  603.         DW      1194,  1, 1435,  1, 1677,  1, 1920,  1, 2164, 1  ; 5->9
  604.         DW      2409,  1, 2655,  1, 2902,  1, 3149,  1, 3397, 1  ; 10->14
  605.         DW      3647,  1, 3897,  1, 4148,  1, 4400,  1, 4653, 1  ; 15->19
  606.         DW      4907,  1, 5157,  1, 5417,  1, 5674,  1, 5932, 1  ; 20->24
  607.         DW      6190,  1, 6449,  1, 6710,  1, 6971,  1, 7233, 1  ; 25->29
  608.         DW      7496,  1, 7761,  1, 8026,  1, 8292,  1, 8559, 1  ; 30->34
  609.         DW      8027,  1, 9096,  1, 9366,  1, 9636,  1, 9908, 1  ; 35->39
  610.         DW      10181, 1, 10455, 1, 10730, 1, 11006, 1, 11283,1  ; 40->44
  611.         DW      11560, 1, 11839, 1, 12119, 1, 12400, 1, 12682,1  ; 45->49
  612.         DW      12965, 1, 13249, 1, 13533, 1, 13819, 1, 14106,1  ; 50->54
  613.         DW      14394, 1, 14684, 1, 14974, 1, 15265, 1, 15557,1  ; 55->59
  614.         DW      15850, 1, 16145, 1, 16440, 1, 16737, 1, 17034,1  ; 60->64
  615.         DW      17333, 1, 17633, 1, 17933, 1, 18235, 1, 18538,1  ; 65->69
  616.         DW      18842, 1, 19147, 1, 19454, 1, 19761, 1, 20070,1  ; 70->74
  617.         DW      20379, 1, 20690, 1, 21002, 1, 21315, 1, 21629,1  ; 75->79
  618.         DW      21944, 1, 22260, 1, 22578, 1, 22897, 1, 23216,1  ; 80->84
  619.         DW      23537, 1, 23860, 1, 24183, 1, 24507, 1, 24833,1  ; 85->89
  620.         DW      25160, 1, 25488, 1, 25817, 1, 26148, 1, 26479,1  ; 90->94
  621.         DW      26812, 1, 27146, 1, 27481, 1, 27818, 1, 28155,1  ; 95->99
  622.         DW      28494, 1, 28834, 1, 29175, 1, 29518, 1, 29862,1  ; 100->104
  623.         DW      30207, 1, 30553, 1, 30900, 1, 31248, 1, 31599,1  ; 105->109
  624.         DW      31951, 1, 32303, 1, 32657, 1, 33012, 1, 33369,1  ; 110->114
  625.         DW      33726, 1, 34085, 1, 34446, 1, 34807, 1, 35170,1  ; 115->119
  626.         DW      35534, 1, 35900, 1, 36267, 1, 36635, 1, 37004,1  ; 120->124
  627.         DW      37375, 1, 37747, 1, 38121, 1, 38496, 1, 38872,1  ; 125->129
  628.         DW      39250, 1, 39629, 1, 40009, 1, 40391, 1, 40774,1  ; 130->134
  629.         DW      41158, 1, 41544, 1, 41932, 1, 42320, 1, 42710,1  ; 135->139
  630.         DW      43102, 1, 43495, 1, 43889, 1, 44285, 1, 44682,1  ; 140->144
  631.         DW      45081, 1, 45481, 1, 45882, 1, 46285, 1, 46690,1  ; 145->149
  632.         DW      47095, 1, 47503, 1, 47917, 1, 48322, 1, 48734,1  ; 150->154
  633.         DW      49147, 1, 49562, 1, 49978, 1, 50396, 1, 50815,1  ; 155->159
  634.         DW      51236, 1, 51658, 1, 52082, 1, 52507, 1, 52934,1  ; 160->164
  635.         DW      53363, 1, 53793, 1, 54224, 1, 54658, 1, 55092,1  ; 165->169
  636.         DW      55529, 1, 55966, 1, 56406, 1, 56847, 1, 57289,1  ; 170->174
  637.         DW      57734, 1, 58179, 1, 58627, 1, 59076, 1, 59527,1  ; 175->179
  638.         DW      59979, 1, 60433, 1, 60889, 1, 61346, 1, 61805,1  ; 180->184
  639.         DW      62265, 1, 62727, 1, 63191, 1, 63657, 1, 64124,1  ; 185->189
  640.         DW      64593, 1, 65064, 1, 0,     2, 474,   2, 950,  2  ; 190->194
  641.         DW      1427,  2, 1906,  2, 2387,  2, 2870,  2, 3355, 2  ; 195->199
  642.         DW      3841,  2, 4327,  2, 4818,  2, 5310,  2, 5803, 2  ; 200->204
  643.         DW      6298,  2, 6795,  2, 7294,  2, 7794,  2, 8296, 2  ; 205->209
  644.         DW      8800,  2, 9306,  2, 9814,  2, 10323, 2, 10835,2  ; 210->214
  645.         DW      11348, 2, 11863, 2, 12380, 2, 12899, 2, 13419,2  ; 215->219
  646.         DW      13942, 2, 14467, 2, 14993, 2, 15521, 2, 16051,2  ; 220->224
  647.         DW      16583, 2, 17117, 2, 17653, 2, 18191, 2, 18731,2  ; 225->229
  648.         DW      19273, 2, 19817, 2, 20362, 2, 20910, 2, 21460,2  ; 230->234
  649.         DW      22011, 2, 22565, 2, 23121, 2, 23678, 2, 24238,2  ; 235->239
  650.         DW      24800, 2, 25363, 2, 25929, 2, 25497, 2, 27067,2  ; 240->244
  651.         DW      27639, 2, 28213, 2, 28789, 2, 29367, 2, 29947,2  ; 245->249
  652.         DW      30530, 2, 31114, 2, 31701, 2, 32289, 2, 32880, 2 ; 250->254
  653.         DW      33473, 2, 34068, 2                               ; 255->256
  654.  
  655. FineLinearSlideDownTable Label ; Values are 0.16 bit
  656.         DW      65535, 65477, 65418, 65359, 65300, 65241, 65182, 65359 ; 0->7
  657.         DW      65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 ; 8->15
  658.  
  659. LinearSlideDownTable    Label ; Values are 0.16 bit
  660.         DW      65535, 65300, 65065, 64830, 64596, 64364, 64132, 63901 ; 0->7
  661.         DW      63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 ; 8->15
  662.         DW      61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 ; 16->23
  663.         DW      60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 ; 24->31
  664.         DW      58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 ; 32->39
  665.         DW      56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 ; 40->47
  666.         DW      55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 ; 48->55
  667.         DW      53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 ; 56->63
  668.         DW      52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 ; 64->71
  669.         DW      50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 ; 72->79
  670.         DW      49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 ; 80->87
  671.         DW      47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 ; 88->95
  672.         DW      46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 ; 96->103
  673.         DW      45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 ;104->111
  674.         DW      43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 ;112->119
  675.         DW      42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 ;120->127
  676.         DW      41285, 41136, 40988, 10840, 40639, 40566, 40400, 40253 ;128->135
  677.         DW      40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 ;136->143
  678.         DW      38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 ;144->151
  679.         DW      37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 ;152->159
  680.         DW      36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 ;160->167
  681.         DW      35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 ;168->175
  682.         DW      34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 ;176->183
  683.         DW      33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 ;184->191
  684.         DW      32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 ;192->199
  685.         DW      31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 ;200->207
  686.         DW      30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 ;208->215
  687.         DW      30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 ;216->223
  688.         DW      29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 ;224->231
  689.         DW      28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 ;232->239
  690.         DW      27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 ;240->247
  691.         DW      26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 ;248->255
  692.         DW      26008                                                  ; 256
  693.  
  694. ;───────────────────────────────────────────────────────────────────────────────
  695.  
  696.                                   Effect Info
  697.  
  698. Here's about all the info I can think of for effects. "Process" variables are
  699. variables used internally by effects to control the direction of playback..
  700. This section has not been completed yet.
  701.  
  702. First, here is the rough flow chart for processing information, it's not fully
  703. detailed, but all of the important steps are detailed.
  704.  
  705.        ┌─────────────────────────────────────────────────────────┐
  706.        │ Set note volume to volume set for each channel          │
  707.        │ Set note frequency to frequency set for each channel    │
  708.        └────────────┬────────────────────────────────────────────┘
  709.                     │
  710.        ┌────────────┴────────────┐
  711.        │ Decrease tick counter   │        Yes
  712.        │  Is tick counter 0 ?    ├─────────────────────────┐
  713.        └────────────┬────────────┘                         │
  714.                     │                                      │
  715.                 No  │                ┌─────────────────────┴──────────────────┐
  716.        ┌────────────┴────────────┐   │ Tick counter = Tick counter set        │
  717.        │ Update effects for each │   │                  (the current 'speed') │
  718.        │  channel as required.   │   │      Decrease Row counter.             │
  719.        │                         │   │        Is row counter 0?               │
  720.        └───┬─────────────────────┘   └────────────┬──────────┬────────────────┘
  721.            │                                  No  │          │
  722.            │                ┌─────────────────────┘          │ Yes
  723.            │                │                                │
  724.            │  ┌─────────────┴──────────────┐ ┌───────────────┴────────────────┐
  725.            │  │ Call init-effects for each │ │  Row counter = 1               │
  726.            │  │ channel.                   │ │                                │
  727.            │  └──────────────┬─────────────┘ │ Increase ProcessRow            │
  728.            │                 │               │ Is ProcessRow > NumberOfRows?  │
  729.            ├─────────────────┘               └────────┬──────────────────┬────┘
  730.            │                                      Yes │                  │ No
  731.            │         ┌────────────────────────────────┴──────────────┐   │
  732.            │         │  ProcessRow = BreakRow                        │   │
  733.            │         │  BreakRow = 0                                 │   │
  734.            │         │  Increase ProcessOrder                        │   │
  735.            │         │  while Order[ProcessOrder] = 0xFEh,           │   │
  736.            │         │                         increase ProcessOrder │   │
  737.            │         │  if Order[ProcessOrder] = 0xFFh,              │   │
  738.            │         │                         ProcessOrder = 0      │   │
  739.            │         │  CurrentPattern = Order[ProcessOrder]         │   │
  740.            │         └─────────────────────┬─────────────────────────┘   │
  741.            │                               │                             │
  742.            │                               ├─────────────────────────────┘
  743.            │                               │
  744.            │         ┌─────────────────────┴──────────────────────────┐
  745.            │         │ CurrentRow = ProcessRow                        │
  746.            │         │ Update PatternData (includes jumping to the    │
  747.            │         │  appropriate row if required, and getting the  │
  748.            │         │  NumberOfRows for the pattern)                 │
  749.            │         └─────────────────────┬──────────────────────────┘
  750.            │                               │
  751.            ├───────────────────────────────┘
  752.            │
  753.        ┌───┴───────────────┐       Yes        ┌───────────────────────────────┐
  754.        │ Instrument mode?  ├──────────────────┤ Update Envelopes as required  │
  755.        └───┬───────────────┘                  │ Update fadeout as required    │
  756.            │                                  │ Calculate final volume if req │
  757.            │ No (Sample mode)                 │ Calculate final pan if req    │
  758.            │                                  │ Process sample vibrato if req │
  759.        ┌───┴─────────────────────────────────┐└───────────────┬───────────────┘
  760.        │ Calculate final volume if required  │                │
  761.        │ Calculate final pan if requried     │                │
  762.        │ Process sample vibrato if required  │                │
  763.        └───┬─────────────────────────────────┘                │
  764.            │                                                  │
  765.            │                                                  │
  766.            └─────────────────────────┬────────────────────────┘
  767.                                      │
  768.                     ┌────────────────┴──────────────────┐
  769.                     │ Output sound!!!                   │
  770.                     └───────────────────────────────────┘
  771.  
  772. Axx     Set Tempo
  773.  
  774.         if (xx != 0) {
  775.                 Maxtick = xx;
  776.                 Currenttick = xx;
  777.         }
  778.  
  779. Bxx     Jump to Order
  780.  
  781.         ProcessOrder = xx - 1;
  782.         ProcessRow = 0xFFFE; // indicates new pattern internally for IT...
  783.  
  784. Cxx     Break to Row
  785.  
  786.         BreakRow = xx;
  787.         ProcessRow = 0xFFFE;
  788.  
  789. Dxx     Volume slide down
  790.  
  791.         if (xx == 0) then xx = last xx for (Dxx/Kxx/Lxx) for this channel.
  792.  
  793.         Order of testing: Dx0, D0x, DxF, DFx
  794.  
  795. Dx0     Set effect update for channel enabled if channel is ON.
  796.         If x = F, then slide up volume by 15 straight away also (for S3M compat)
  797.         Every update, add x to the volume, check and clip values > 64 to 64
  798. D0x     Set effect update for channel enabled if channel is ON.
  799.         If x = F, then slide down volume by 15 straight away also (for S3M)
  800.         Every update, subtract x from the volume, check and clip values < 0 to 0
  801. DxF     Add x to volume straight away. Check and clip values > 64 to 64
  802. DFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  803.  
  804. Hxy     Vibrato
  805.  
  806.         if (x != 0) {
  807.                 speed = 4*x;
  808.         }
  809.         if (y != 0) {
  810.                 depth = y * 4;
  811.                 if(OldEffects) depth <<= 1;
  812.         }
  813.         Set effect update for channel enabled if channel is ON.
  814.         Goto InitVibrato (explained later)
  815.  
  816. Ixy     Tremor, ontime x, offtime y
  817.  
  818.         if (x != 0) {
  819.                 ontime = x;
  820.                 if (oldeffects) ontime++;
  821.         }
  822.         if (y != 0) {
  823.                 offtime = y;
  824.                 if (oldeffects) offtime++;
  825.         }
  826.  
  827. Nxx     Channel volume slide down
  828.  
  829.         if (xx == 0) then xx = last Nxx for this channel.
  830.  
  831.         Order of testing: Nx0, N0x, NxF, NFx
  832.  
  833. Nx0     Set effect update for channel enabled.
  834.         Every update, add x to the volume, check and clip values > 64 to 64
  835. N0x     Set effect update for channel enabled.
  836.         Every update, subtract x from the volume, check and clip values < 0 to 0
  837. NxF     Add x to volume straight away. Check and clip values > 64 to 64
  838. NFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  839.  
  840. Uxy     Fine Vibrato
  841.  
  842.         if (x != 0) {
  843.                 speed = 4*x;
  844.         }
  845.         if (y != 0) {
  846.                 depth = y;
  847.                 if(OldEffects) depth <<= 1;
  848.         }
  849.         Set effect update for channel enabled if channel is ON.
  850.         Goto InitVibrato (explained later)
  851.  
  852. Wxx     Global volume slide down
  853.  
  854.         if (xx == 0) then xx = last Wxx for this channel.
  855.  
  856.         Order of testing: Wx0, W0x, WxF, WFx
  857.  
  858. Wx0     Set effect update for channel enabled.
  859.         Every update, add x to the volume, check and clip values > 128 to 128
  860. W0x     Set effect update for channel enabled.
  861.         Every update, subtract x from the volume, check and clip values < 0 to 0
  862. WxF     Add x to volume straight away. Check and clip values > 128 to 128
  863. WFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  864.  
  865.  
  866.